//
//  HKOCRouter.h
//  HKUtilities
//
//  Created by 胡锦涛 on 2018/11/11.
//  Copyright © 2018 胡锦涛. All rights reserved.


#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
///使用路由跳转的控制器需要遵守HKOCRouterProtocol协议
@protocol HKRouterProtocol <NSObject>
+ (instancetype _Nullable )hk_createViewController:(id _Nonnull )parameters;
@end

///路由回调
typedef void(^HKHandlerCallBack)(NSString * _Nonnull callTag, id _Nonnull results);
typedef void (^HKRouterHandler)(NSDictionary *_Nonnull result);
NS_ASSUME_NONNULL_BEGIN

@interface HKRouter : UIView
///当前导航
@property(nonatomic,weak) UINavigationController *currentNavigationController;

//单例
+(instancetype)shared;

#pragma mark - 组件通信方法
/**
 注册路由
 @param routePattern 路由规则
 @param targetName 目标控制器名称
 */
+(void)hk_registerRoutePattern:(NSString *)routePattern targetName:(NSString *)targetName;

/**
 注册路由
 @param routePattern 路由规则
 @param targetName 目标控制器名称
 @param handlerBlock 回调block [callTag:回调标记, parameters:回调数据]
 */
+ (void)hk_registerRoutePattern:(NSString *)routePattern targetName:(NSString *)targetName handler:(void(^)(NSString *callTag, id parameters))handlerBlock;

/**
 注销路由
 @param routePattern 路由规则
 */
+ (void)hk_removeRoutePattern:(NSString *)routePattern;

/**
 注销路由
 @param className Class名称
 */
+(void)hk_removeRoutePatternWithController:(Class)className;


/**
 开始路由
 @param routePattern 路由规则
 @return 是否可以路由
 */
+ (BOOL)hk_startRoute:(NSString *)routePattern;

/**
 开始路由
 @param URL 路由URL
 @return 是否可以路由
 */
+ (BOOL)hk_startRouteWithURL:(NSURL *)URL;


#pragma mark - 其他
/*
 使用：
 1.创建一个类格式eg：Target_A
 2.声明一个方法eg：Action_
 3.调用此方法:
 UIViewController * vc = [[HKOCRouter shareInstance] hk_remotePerformWithUrl:@"hk://Index/getUserInfo"];
 Index为组件索引；getUserInfo为actionName；“:”冒号表示带参数.
 此方法是调用Target_Index类中，方法名为Action_getUserInfo方法
 */

///远程App调用入口-不带回调
+ (id)hk_remotePerformWithUrl:(NSString *)urlStr;

///远程App调用入口-带回调
+ (id)hk_remotePerformWithUrl:(NSString *)urlStr handler:(HKRouterHandler)handler;

///本地组件调用入口
+ (id)hk_localPerformTarget:(NSString *)targetName action:(NSString *)actionName param:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget;

///释放CachedTarget
+ (void)hk_releaseCachedTargetWithTargetName:(NSString *)targetName;

@end

@interface UIViewController (HKRouter)

@property(nonatomic,copy) HKHandlerCallBack handlerBlock;
@property(nonatomic,assign) BOOL hk_isPresent;
@end

NS_ASSUME_NONNULL_END
